package thread;

/**
 * @User: vitobo
 * @Date: 2024-08-01
 * @Description: 单例模式 : 确保一个类只有一个实例，并提供一个全局访问点
 *
 * 饿汉模式: 类加载阶段, 就把实例创建出来了(类加载是比较靠前的) 保证只能创建出一个实例
 *
 * 饿汉模式: 多线程调用,只是涉及到 "读" 操作
 */

// 饿汉模式 单例模式实现
// 保证　只能创建出一个实例
class Singleton{
    // 先把这个实例创建出来
    // Java代码中的每个类,都会在编译完成后得到.class文件,
    //     JVM运行时就会加载这个.class文件读取其中的二进制指令,并且在内存中构造出对应的类对象
    //     例如:Singleton.class
    // 由于 类对象 在一个Java进程里, 只有唯一一份的; 因此类对象内部的 类属性 也是唯一一份的


    // static这个操作,是让当前instance属性是类属性, 类属性是长在类对象上的, 类对象又是唯一实例的
    // static: 保证这个实例是唯一的
    // static: 保证这个实例确实 在一定时机中被创建出来
    private static Singleton instance = new Singleton();

    // 如果需要使用这个唯一实例, 统一通过Singleton.getInstance() 方式来获取;
    public static Singleton getInstance(){
        return instance;
    }

    // 为了避免 Singleton类 不小心被复制出多份
    // 把构造方法设为private, 在类外,就无法通过new的方式来创建这个 Singleton实例了
    private Singleton(){};

}

public class ThreadDemo19 {

    public static void main(String[] args) {
        Singleton s = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();

        //Singleton s3 = new Singleton();
        System.out.println(s == s2);
    }
}
